public class Code2 {
    // 粉刷房子
    public int minCost(int[][] costs) {
        // 1、创建 dp 表
        // 2、初始化
        // 3、填表
        // 4、填写返回值

        // 创建 dp 表
        // 这里根据题目简单分析，我们可以得出粉刷房间是有三种颜色的，我们可以将三个颜色分别标记为 0、1、2. 此时，我们就需要创建出一个 n * 3 范围的一个 dp 表
        // dp[i][0] 为例，这就表示的是到 i 位置时，此时在最后一个位置上粉刷上 红色，此时的最小花费
        int n = costs.length;
        // 在这里前面是需要添加一个虚拟节点的，此时就需要进行一个 + 1 操作
        // 确保第一个dp[0]位置的值为 0
        int[][] dp = new int[n + 1][3];
        // 从第一个位置开始填表
        for(int i = 1;i <= n;i++){
            // 注意填表时候的映射关系
            dp[i][0] = Math.min(dp[i - 1][1],dp[i - 1][2]) + costs[i - 1][0];
            dp[i][1] = Math.min(dp[i - 1][0],dp[i - 1][2]) + costs[i - 1][1];
            dp[i][2] = Math.min(dp[i - 1][1],dp[i - 1][0]) + costs[i - 1][2];
        }
        // 确定返回值为三个表中最后一个位置的最小花费
        return Math.min(dp[n][0],Math.min(dp[n][1],dp[n][2]));
    }
}
